iT邦幫忙

2024 iThome 鐵人賽

DAY 5
0
Software Development

從身邊神人大大身上學到的那些事系列 第 5

Use-the-index-luke 讀後筆記-2(where篇)

  • 分享至 

  • xImage
  •  

接著前一篇的介紹,我們可以發現,如果我們要使用index,會需要幾個步驟

  1. 透過條件比較來找尋index的位置
  2. 抓取原來資料表的資料

在原文中,提到的是三個步驟,但因為他有介紹B+樹的內容,所以會有三步
(1) the tree traversal; (2) following the leaf node chain; (3) fetching the table data.

所以可以發現,如果要讓query變快,可以透過下面幾個方法

  1. 對有建立index的欄位建立搜尋條件,並且使用相等(number = "0908070605)或是從字首開始的模糊搜尋(number like "0908%")
    為什麼這樣會變快呢?
    在先前的索引中有提到,這個索引的使用方式是用類似電話簿的方式下去搜尋的,而且是由前往後,由小到大的排序
    因此如果想有效的利用這個電話簿,不外乎就是需要從頭開始比內容,才有辦法快速找到內容
    比如這個index
phone diskAddress
0908070605 0x13579
0912333555 0x12345
0912345178 0x56789

因為他有依照由前往後,由小到大的排序,所以如果我們希望找到"0912"開頭的,很容易就可以找到
但如果這時候我們想找"555"結尾的,這個index就會派不上用場,只能從頭找到最後一筆,就會很沒有效率

也可以參考官方的例子,附上連結
https://use-the-index-luke.com/sql/where-clause/searching-for-ranges/like-performance-tuning#fig-like

  1. Partial Indexes

在index的建立中,除了可以針對一個欄位全部做index,也可以針對特定條件做index
比如說,我的index條件可以設定為,在近三個月內創建的資料建立index(現在是2024/09/12)

id phone name created_at
5 0908070605 user5 2024-08-15 14:25:00
1 0912333555 user1 2024-01-22 09:10:45
3 0912345678 user3 2023-12-05 18:35:20
6 0912999888 user6 2024-06-30 08:00:10
7 0922111333 user7 2024-04-12 17:22:33
8 0933444555 user8 2024-03-28 11:15:50
9 0944555666 user9 2023-10-30 13:45:25
10 0955666777 user10 2024-05-18 22:50:12
11 0966777888 user11 2024-07-05 07:35:40

那這時候,你的index就會變的很小,從原本要找9筆資料,變成

id phone name created_at
5 0908070605 user5 2024-08-15 14:25:00
11 0966777888 user11 2024-07-05 07:35:40

就瞬間剩下兩筆資料
這種情境的適用場景很多,比如訂單系統希望可以把代出貨的資料特別建立index,因為這些資料最常被搜尋

Ref:
https://use-the-index-luke.com/sql/where-clause


上一篇
Use-the-index-luke 讀後筆記-1(Index是什麼,以電話簿來舉例)
下一篇
Use-the-index-luke 讀後筆記-3(where篇)
系列文
從身邊神人大大身上學到的那些事30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言